// 滑块
function maxSlidingWindow(nums, k) {
    let res = []
    let slid = []
    for (let i = 0; i < nums.length; i++) {
        const element = nums[i];
        if (slid.length < k) {
            slid.push(element)
            if (slid.length < k) {
                continue
            }
        }
        let max  = slid[0]
        for (let j = 1; j < slid.length; j++) {
            max = Math.max(max, slid[j])
        }
        res.push(max)
        slid.shift()
    }
    return res
}

let nums = [7,2,4]

console.log(maxSlidingWindow2(nums,2))
function maxSlidingWindow(nums, k) {
    const q = [];  //保存滑块内索引，q中索引对应位置的nums值，从大到小 
    const res = [];
    for (let i = 0; i < nums.length; i++) {
       // 1 循环 保证q中索引对应位置的nums值，从大到小 如果前面数小则需要依次弹出，直至满足要求
        while (q && nums[q[q.length - 1]] <= nums[i]) {
            q.pop();
        }
        q.push(i);
        // 2 保证q里面的索引没有超出滑块的长度，即满足: q[0] + k >= i
        // 如果q[0] + k < i ,那么说明q[0]这个索引位置已经超出了滑块的范围。
        // 滑块的范围内的元素的索引，应该是要大于i-k, 如果小于了i-k, 那么该元素已经超过了滑块范围
        if (q[0] === i - k) {
            q.shift();
        }
        // 3 滑块的元素个数达到k个的时候，才开始取滑块内的最大值
        // 由于第1步中，保证了q[0]位置是当前滑块内的最大值
        if (i >= k - 1) {
            res.push(nums[q[0]]);
        }
    }
    return res; 
  }

  console.log(maxSlidingWindow(nums,3))